package com.qf.commons.web.base;

import cn.hutool.extra.spring.SpringUtil;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

@Slf4j
public class BaseController<T>{

    /**
     * Controller持有的一个Service对象
     */
    private T service;

    /**
     * 初始化方法 - Bean被IOC初始化时，会自动执行该注解标记的方法....
     */
    @PostConstruct
    public void init(){
        //this代表的是子类的Controller
        //获取返回T的类型
        Type type = this.getClass().getGenericSuperclass();
        if (type instanceof ParameterizedType pt) {
            //获得泛型数组
            Type[] actualTypeArguments = pt.getActualTypeArguments();
            //获取第一个泛型的类型
            Class pcls = (Class) actualTypeArguments[0];
            //从SpringIOC中手动获取T类型的Bean对象
            T bean = (T) SpringUtil.getBean(pcls);
            //设置给service
            service = bean;
        } else {
            log.debug("当前父类未找到泛型信息....." + type);
        }
    }


    public T getBaseService(){
        return service;
    }
}
